<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象相关</title>
</head>
<body>

<script type="text/javascript">
    // 9.3 创建以个对象
    // 1.字面量方式创建对象
    var obj = {
        name:"张三",
        age:30,
        sex:"男",
        ctrl:function() {
            console.log("唱跳rap篮球");
        }
    };
    console.log(obj);
    // 2.使用new Object()创建对象
    var obj2 = new Object();
    obj2.name = "李四";
    obj2.age = 20;
    obj2.sex = "女";
    console.log(obj2);
    // 3.使用构造函数创建对象
    function Person(name,age,sex) {
        console.log(this, typeof this); //先输出结果为Person{} 可以展开看详细数据 **和下述方法不一样的原因：属性还没有编译出来，后面的属性已经编译出来了，所以在方法里可以显示**
        document.write(this, typeof this, "<hr>");  //和在外面输出的结果是一样的，没有区别，
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.ctrl = function() {
            console.log("唱跳rap篮球");
            return "唱跳rap篮球";
        }
        console.log(this, typeof this); //输出Person {name: '王五', age: 18, sex: '男', ctrl: ƒ} 也能够展开 但是不需要展开就能看到详细数据
    }
    var p1 = new Person("王五",18,"男");
    console.log(p1,typeof p1);  //输出Person {name: '王五', age: 18, sex: '男', ctrl: ƒ} 也能够展开 但是不需要展开就能看到详细数据
    document.write(p1,typeof p1);

    //this 执行代码时，是在哪个对象里面，this就是指向谁
    function Person(n,a) {
        this.name = n;
        this.age = a;
        this.height = '180';
        this.say = function() {
            return '你好！, 我叫' + this.name;
        }
    }
    var p1 = new Person("张三",18);
    var p2 = new Person("李四",20);
    console.log(p1, p2);
    console.log(p1.say());
    console.log(p2.say());

    //特殊场景 普通函数 this指向一个windows对象（js内置好的）
    //js运行在浏览器时，window对象就叫做全局对象
    function f1() {
        console.log(this);             //输出window
    }
    f1();

    // alert 等函数，其实都是window全局对象下的成员，window，可以省略不写
    /*alert('123');
    window.alert('456');*/
    var num = 100;
    console.log(window);
</script>
</body>
</html>